package main

/**
GO 面向对象
结构体 构造函数
 */

import (
	"encoding/json"
	"fmt"
)

/**
在go中，首字母大小写有特殊的语法含义，小写包外无法引用。
由于需要和其它的系统进行数据交互，例如转成json格式。
这个时候如果用属性名来作为键值可能不一定会符合项目要求。
tag在转换成其它数据格式的时候，会使用其中特定的字段作为键值。
 */
type User struct {
	Name string `json:"name"`
	Age  int32 `json:"age"`
	mess string
}

type Birthday struct {
	year,month,day int32
}
//一个结构体继承多个结构体，访问通过点。继承字段以及方法。
type Person struct {
	User
	birthday Birthday
	email string
	int
	score int
}

type Result struct {
	code int32
	message string
}

//构造函数
func NewUser(name string, age int32, mess string) *User {
	return &User{Name:name,Age:age,mess:mess}
}

//如果实现了String()这个方法，那么fmt默认会调用String()。
func (r *Result) String() string{
	return fmt.Sprintf("This is String(%d %s).", r.code , r.message)
}

func main() {
	result := new(Result)
	fmt.Println(result)
	result.code = 200
	result.message = "OKAY"
	fmt.Println(result)
	ret := fmt.Sprintf("This is String111(%d %s).",result.code,result.message)
	fmt.Println(ret)

	user := NewUser("suoning", 18, "lover")
	fmt.Println(user, user.mess, user.Name, user.Age)

	birthdate := Birthday{1978,1,3}

	person := Person{*user,birthdate,"archerchu@163.com",0,100}
	fmt.Println(person)

	conJson, _ := json.Marshal(user)
	fmt.Println(string(conJson))
}